/* Se incorpora a las funciones de variables de precio la posibilidad de 
   tener argumentos enteros
*/

CREATE OR REPLACE FUNCTION public.pre_preprocesofunciones(character varying)
  RETURNS character varying AS
$BODY$  
DECLARE
 formulaFinal ALIAS FOR $1;
 funcionDesdeFuncion integer;
 funcionLongitud integer;
 funcionDesdeArgumentos integer;
 funcionLongitudArgumentos integer;

 inicioVariable integer;
 finVariable    integer;
 idVariable     integer;
 codVariable    varchar;
 

 resultado numeric(15,4);
 cadenaResultado varchar;
 i_split integer;
BEGIN
 -- Cambio las variables de precio por su ID.
  LOOP
    IF POSITION('#' in formulaFinal) = 0 THEN EXIT; 
    END IF;
      inicioVariable := position('#' in formulaFinal); 
      finVariable    := position('#' in substring(formulaFinal,inicioVariable + 1, 10000)) + inicioVariable;   
      codVariable    := substring(formulaFinal,inicioVariable + 1, finVariable - inicioVariable - 1); 
      idVariable     := (SELECT ID FROM PRE WHERE COD = codVariable); 
      formulaFinal   := substring(formulaFinal,0,inicioVariable) || to_char(idVariable, 'FM9999') || substring(formulaFinal, finVariable + 1, 10000);
  END LOOP;
  LOOP
  IF (position('@' in formulaFinal) = 0) THEN EXIT; 
  END IF;
  funcionDesdeFuncion    := position('@' IN formulaFinal);
  funcionLongitud        := position('@' IN substring(formulaFinal, funcionDesdeFuncion + 1, length(formulaFinal)));
  funcionDesdeArgumentos    := position('(' in substring(formulaFinal, funcionDesdeFuncion, length(formulaFinal))) + funcionDesdeFuncion;
  funcionLongitudArgumentos := position('@' IN substring(formulaFinal, funcionDesdeArgumentos + 1, length(formulaFinal))) - 2;
  i_split := 1;
  cadenaResultado := '';
  LOOP
    IF (split_part(substring(formulaFinal, funcionDesdeArgumentos, funcionLongitudArgumentos + 1),';',i_split)) = '' THEN EXIT;
    END IF;
    IF es_entero(split_part(substring(formulaFinal, funcionDesdeArgumentos, funcionLongitudArgumentos + 1),';',i_split)) THEN 
       cadenaResultado := cadenaResultado || split_part(substring(formulaFinal, funcionDesdeArgumentos, funcionLongitudArgumentos + 1),';',i_split) || ',';
    ELSE
       EXECUTE 'SELECT ' || split_part(substring(formulaFinal, funcionDesdeArgumentos, funcionLongitudArgumentos + 1),';',i_split) INTO RESULTADO;
       cadenaResultado := cadenaResultado || cast(resultado as varchar) || ',';
    END IF;
    i_split := i_split + 1; 
  END LOOP;
   
  formulaFinal := replace(substring(formulaFinal, 0, funcionDesdeArgumentos),'@',' ') || substring(cadenaResultado, 0, length(cadenaResultado))  || ')' || 
                  substring(formulaFinal, funcionDesdeFuncion + funcionLongitud + 2, 10000);

END LOOP;

  return formulaFinal; 

END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.pre_preprocesofunciones(character varying)
  OWNER TO abacouser;

/* ----------------------------------------------------------- */

CREATE OR REPLACE FUNCTION es_numero(character varying)
  RETURNS boolean AS
$BODY$

-- Recibe un string y devuelve verdadero si es un numero y falso si no. El numero puede ser entero o real y puede contener un punto (no coma)

DECLARE

cadena ALIAS FOR $1;        

i  	  INTEGER;

numPuntos INTEGER;

resultado BOOLEAN;

BEGIN

i := 1;

numPuntos := 0;

resultado:= true;

cadena := trim(cadena);

WHILE (i <= Length(cadena)) AND resultado AND (numPuntos <= 1) LOOP

BEGIN

IF (SUBSTR(cadena, i, 1) BETWEEN '0' AND '9') OR (SUBSTR(cadena, i, 1) = '.') OR (i = 1 AND (SUBSTR(cadena, i, 1) = '-')) THEN

BEGIN

IF (SUBSTR(cadena, i, 1) = '.') THEN

numPuntos := numPuntos + 1;

END IF;

i := i + 1;

END;

ELSE

resultado := False; 

END IF;

END;

END LOOP; --while

IF (numPuntos > 1) THEN

resultado := False;

END IF;	   

RETURN resultado;

END;

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION es_numero(character varying)
  OWNER TO abacouser;

-- ==============================================================
SELECT aaVersion('430.03','430.02');
-- ==============================================================

